import {
	reactive,
	ref
} from 'vue';
import * as S from "@/utils/storage.js"

export function useLru() {
	// 主要存数据的内容 {key:[{id:1,value:1},key2:[{id:1,value:1}]}
	let lruObj = reactive({})
	// 主要存长度的 {key5,key2:5}
	let len = reactive({})
	/**
	 * @param {Object} key  要存的缓存的key
	 * @param {Object} ID   唯一值
	 * @param {Object} value 值
	 */
	function set(key, ID, value) {
		if (!lruObj[key]) {
			console.log("key" + key + "不存在！")
			return false
		}
		let arr = []
		arr = lruObj[key]
		// findIndex 如果符合条件 返回下标 没有符合的 返回-1
		let indexKey = arr.findIndex(item => item.ID === ID);
		// for(let i=0;i<arr.length;i++){
		// 	if(arr[i].ID===ID){
		// 		indexKey = i
		// 		break
		// 	}
		// }
		// 这就说明 数组中存在这条数据
		if (indexKey != -1) { //交换位置
			// 取出这条数据
			let tempObj = arr[indexKey]
			// 在原数组中删除这条数据
			arr.splice(indexKey, 1)
			// 把这条数据 放到最后面
			arr.push(tempObj)
		} else { //如果不存在 直接放到最后
			arr.push({
				ID: ID,
				value: value
			})
			// 如果超出长度 把队列第一条删掉 
			if (arr.length > len[key]) {
				arr.shift()
			}
		}
		// 更新本地 存储
		S.setItem("lruObj", {
			lrulen: len,
			lruObj: lruObj
		})
		return true
	}

	function get(key) {
		try {
			return lruObj[key]
		} catch (e) {
			//TODO handle the exception
			return []
		}
	}
	/**
	 * @param {Object} key 初始化的下标
	 * @param {Object} countLent 要存的长度
	 */
	function init(key, countLent) {
		// 读取本地存储 看LRU是否存在
		let storageLru = S.getItem("lruObj")
		// 如果有值
		if (storageLru) {
			// 将本地存储的值 赋值给 hooks的变量
			lruObj = storageLru.lruObj
			len = storageLru.lrulen
			console.log(lruObj, 78)
			try {
				// 如果本地存储 不存在key 就初始化一下  创建一下
				if (!lruObj[key]) {
					console.log("82")
					len[key] = countLent
					lruObj[key] = []
				}
			} catch (e) {
				console.log("87")
				len[key] = countLent
				lruObj[key] = []
			}
		} else {
			console.log("92")
			len[key] = countLent
			lruObj[key] = []
		}
		S.setItem("lruObj", {
			lrulen: len,
			lruObj: lruObj
		})
	}

	function del(key) {
		delete lruObj[key]
		delete len[key]
		S.setItem("lruObj", {
			lrulen: len,
			lruObj: lruObj
		})
	}
	/**
	 * @param {Object} key 缓存标识
	 * @param {Object} ID 缓存唯一值
	 */
	function findOne(key, ID) {
		if (!lruObj[key]) {
			return false
		}
		let obj = lruObj[key].find(item => item.ID === ID)
		if (obj) {
			return obj.value
		} else {
			return false
		}
	}

	return {
		init,
		set,
		get,
		del,
		findOne
	};
}